#include <stdio.h>
// gcc -E 01-宏定义.c -o 01-宏定义.i

#define TEST 100
#define ADD(a, b) ((a) + (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define N (2 + 1)

#define LENGTH(arr) (sizeof(arr) / sizeof(arr[0]))
#define IS_EVEN(num) ((num) % 2 == 0)
#define PRINT_NUMBER(n)                \
    {                                  \
        for (int i = 0; i < n; i++)    \
        {                              \
            if (IS_EVEN(i))            \
            {                          \
                printf("EVEN %d ", i); \
            }                          \
            else                       \
            {                          \
                printf("ODD %d ", i);  \
            }                          \
        }                              \
    }

#define CHANGE(STR) #STR
#define CHANGE2(STR) #STR + 1

// 使用#a + #b ==== "5" + "10"
// #define ADD1(a, b) (#a + #b)

//  可以把位于它两边的符号合成一个符号  ab 当成了标识符
#define ADD2(a, b) (a##b)

#define STRCAT(str1, str2) str1##str2 // 将str1和str2标识连在一起

int main()
{
    int a = 10;
    int arr[] = {1, 2, 3, 4, 5};
    printf("TEST+50=%d\n", TEST + 50);
    printf("N+50=%d\n", N + 50);

    printf("ADD(10, 20)=%d\n", ADD(10, 20));
    printf("MAX(10, 20)=%d\n", MAX(10, 20));

    printf("arr length=%d\n", LENGTH(arr));
    printf("IS_EVEN(10)=%d\n", IS_EVEN(10));

    PRINT_NUMBER(10);

    // 预定义宏
    printf("文件名：%s\n 当前函数：%s\n 行号：%d\n", __FILE__, __func__, __LINE__);
    ;
    // 当前时间和日期
    printf("当前时间：%s,当前日期： %S\n", __TIME__, __DATE__);

    char *str = {"hello world!", "1111", "2222"};
    printf("str=%s\n", CHANGE(IKUN I love you));
    printf("str=%s\n", CHANGE2(IKUN I love you));

    // printf("ADD1(5, 10)= %s\n", ADD1(5, 10));
    printf("ADD1(5, 10)= %s\n", ADD2(5, 10));

    int sum5 = 100;
    printf("sum5 =  %d\n", STRCAT(sum, 5));
    return 0;
}